'use strict'

process.chdir(__dirname);//自动切换到自己所在目录里面

const fs = require('fs');
const titbit = require('titbit');
const pg = require('pg');
const dbconfig = require('./dbconfig.js');
const wxkey = require('./wxkey.js')
//使用HTTP/1.1的客户端
const {httpcli} = require('gohttp');
const token = require('titbit-token');
let tok = new token({
    //token有效期，单位是秒
    expires:30,

    //必须是32位字母数字
    key:'1wdsdyf2dr45tod84kfht83mfhdjrexd',

    //必须是16位字母数字
    iv:'12sd3fgru4idsjrf'
});

let psql = new pg.Pool(dbconfig);

try{
    fs.accessSync('./images')
    //如果文件中存在路径目录为images,直接进入
}catch(err){
    fs.mkdirSync('./images')
    //如果文件中不存在路径目录为images,创建mul
}

let cert_path = '/usr/local/share'
const app = new titbit({
    //开启调试模式，会输出错误信息
    debug:true,
    globalLog:true,
    cert:`${cert_path}/aaa.coralmh.xyz.pem`,
    key:`${cert_path}/aaa.coralmh.xyz.key`
})
/**----------content路由------------- */
app.get('/content',async c => {
    let sqltext = 'SELECT id,title,update_time FROM content';
    let r = await psql.query(sqltext);

    c.send(r.rows);
})
app.post('/content',async c => {
    try{
        //c.body 是提交的请求体数据
        let data = JSON.parse(c.body);
        let sqltext = 'INSERT INTO content' + '(id,detail,title,add_time,update_time)' + ' VALUES($1,$2,$3,$4,$5)';
        //随机数转成16进制并去掉前两位，字串作为ID
        let id = Math.random().toString(16).substring(2);
        let tm = Date.now()
        let r = await psql.query(sqltext,[
            id,data.detail,data.title,tm,tm
        ])
        if(r.rowCount == 0){
            return c.status(500).send('failed');
        }
        c.send(id);
    }catch(err){
        console.error(err);
        c.status(400).send('bad data');
    }
})
app.get('/content/:id',async c => {
    let id = c.param.id;

    let sqltext = 'SELECT id,detail,title,update_time ' + ' FROM content WHERE id=$1';
    let r = await psql.query(sqltext,[ id ]);
    if(r.rowCount === 0){
        return c.status(404).send('not found');
    }
    c.send(r.rows[0]);
})
app.delete('/content/:id',async c => {
    let r = await psql.query(`DELETE FROM content WHERE id = $1`,
        [c.param.id]
    )
    c.send({
        count:r.rowCount
    })
})
/**------content 路由 -END---------- */
app.get('/',async c => {
    c.send('ok')
})
app.get('/upload',async c => {
    //c.helper是助手函数模块 其中有对stream.pipe函数的封装
    //c.reply是响应对象，http/1.1中指向response，http/2中指向stream
    await c.helper.pipe('./upload.html',c.reply);
});

//JS无需加分号，谁用谁知道，有时也得加分号，括号开头很需要
//箭头函数是用来解救this的    (async () => {})();

app.post('/upload',async c => {
    let f = c.getFile('file');
    if(!f){
        return c.status(400).send('file not found')
    }
    //生成唯一文件名
    let fname = c.helper.makeName(f.filename)
    try {
        await c.moveFile(f,`./images/${fname}`)
        c.send(fname)
    }catch(err){
        c.status(500).send('failed')
    }
})

app.get('/images/:name',async c => {
    //冒号开头表示这个路由是带参数的路由
    let imgname = c.param.name
    try{
        await c.helper.pipe(`./images/${imgname}`,c.reply)
    }catch(err){
        c.status(404).send('image not found');
    }
})

app.get('/user/:name/:age/:mobile',async c => {
    console.log(c.param)
    c.send(c.param)
})

app.get('/mp-login/:code',async c => {
    c.send(c.param);
    let auth_url = `https://api.weixin.qq.com/sns/jscode2session`+`?appid=${wxkey.appid}`+`&secret=${wxkey.secret}`
                    +`&js_code=${c.param.code}`+`&grant_type=authorization_code`;
    let ret = await httpcli.get(auth_url)
    .then(res => res.JSON)
    // .then(res => {
    //     return res.text()
    // })
    c.send(ret)
})

//监听1234端口运行服务
app.run(2002);